package top.honlnk.service.impl.processor;

import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;

import java.time.LocalDate;

@Slf4j
public class AnalysisAdminKeyProcessor {
    private static final String ALPHABET = "0123456789" +
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ".substring(0, 21); // 取前21个字符，即A-U 用于表示0-31的数字

    private static final String POSITION_ALPHABET = "0123456789" +
            "abcdefghijklmnopqrstuvwxyz" +
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ".substring(0, 24); // 共60个字符，取前24个字符，即A-X 用于表示0-59的数字

    private static final String NUM_ALPHABET = "_123456789" +
            "abcdefghijklmnopqrstuvwxyz" +
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ".substring(0, 25); // 共61个字符，取前25个字符，即A-Y 用于表示1-60的数字

    // 获取字符在字母表中的位置
    public Integer getNumber(String character) {
        return NUM_ALPHABET.indexOf(character);
    }

    public LocalDate getTimeDifference(@NotNull String key) {
        // 字符串的第一个字符
        String firstCharacter = key.substring(0, 1);

        // 获取第字符串中的第一个字符，然后获取它表示的“时间差字符”所在的位置
        int PositionNumber = PositionCharForPositionNumber(firstCharacter.charAt(0));
        // 根据位置 找到对应的表示“时间差”的字符，获得所表示的具体的时间差
        int DaysDifference = getDaysDifference(PositionNumber, key);
        // 获取密钥中表示的时间
        GenerateSubmissionIdProcessor generateSubmissionIdProcessor = new GenerateSubmissionIdProcessor();
        LocalDate keyBornTime = generateSubmissionIdProcessor.decode(key.substring(13, 22));
        return keyBornTime.plusDays(DaysDifference);
    }

    private int getDaysDifference(int positionNumber, @NotNull String key) {
        // 取出位于 positionNumber 位置加一的字符
        char nextCharacter = key.charAt(positionNumber + 1);

        // 将取出的字符存到一个变量中
        char nextCharacterString = String.valueOf(nextCharacter).charAt(0);

        // 将字符转换为数字
        return ALPHABET.indexOf(nextCharacterString);
    }

    private int PositionCharForPositionNumber(char positionChar) {
        int number = POSITION_ALPHABET.indexOf(positionChar);
        return number % 10;
    }
}
